import os
import uuid
from django.conf import settings
from qcloud_cos import CosConfig, CosS3Client
import logging

logger = logging.getLogger(__name__)


class TencentCOSManager:
    """
    腾讯云COS管理器
    用于文件上传和删除操作
    """
    
    def __init__(self):
        """初始化COS客户端"""
        try:
            # COS配置
            config = CosConfig(
                Region=settings.TENCENT_COS['REGION'],
                SecretId=settings.TENCENT_COS['SECRET_ID'],
                SecretKey=settings.TENCENT_COS['SECRET_KEY'],
                Token=None,
                Scheme='https'
            )
            self.client = CosS3Client(config)
            self.bucket = settings.TENCENT_COS['BUCKET']
            self.cdn_domain = settings.TENCENT_COS.get('CDN_DOMAIN', '')
        except Exception as e:
            logger.error(f"COS客户端初始化失败: {e}")
            raise e

    def generate_key(self, user_id, image_type, file_extension, vehicle_id=None):
        """
        生成COS中的文件路径和名称
        
        Args:
            user_id: 用户ID
            image_type: 图片类型
            file_extension: 文件扩展名
            vehicle_id: 车辆ID（可选，用于车辆相关图片）
            
        Returns:
            str: 文件在COS中的路径和文件名
        """
        # 生成唯一文件名以避免冲突
        unique_id = uuid.uuid4().hex[:8]
        
        # 对于车辆行驶证图片，使用专门的目录结构
        if image_type == 'vehicle_license':
            return f"users/{user_id}/vehicles/licenses/{user_id}_{image_type}_{unique_id}.{file_extension}"
        # 对于车辆其他图片，使用包含车辆ID的目录结构
        elif image_type == 'vehicle' and vehicle_id:
            return f"users/{user_id}/vehicles/{vehicle_id}/{user_id}_{vehicle_id}_vehicle_{unique_id}.{file_extension}"
        # 对于其他类型的图片，保持原有结构
        else:
            return f"users/{user_id}/{image_type}/{user_id}_{image_type}_{unique_id}.{file_extension}"

    def upload_file(self, file, key):
        """
        上传文件到COS
        
        Args:
            file: 文件对象
            key: 文件在COS中的路径和名称
            
        Returns:
            str: 文件的访问URL
        """
        try:
            response = self.client.put_object(
                Bucket=self.bucket,
                Body=file,
                Key=key,
                EnableMD5=False,
                StorageClass='STANDARD',
                ACL='public-read',  # 设置为公有读权限
                ContentType='image/' + key.split('.')[-1].lower() if '.' in key else 'image/jpeg'
            )
            
            # 生成文件访问URL
            if self.cdn_domain:
                # 如果配置了CDN域名，则使用CDN域名
                url = f"https://{self.cdn_domain}/{key}"
            else:
                # 否则使用默认COS域名
                url = f"https://{self.bucket}.cos.{settings.TENCENT_COS['REGION']}.myqcloud.com/{key}"
            
            logger.info(f"文件上传成功: {url}")
            return url
        except Exception as e:
            logger.error(f"文件上传失败: {e}")
            raise e

    def delete_file(self, key):
        """
        从COS中删除文件
        
        Args:
            key: 文件在COS中的路径和名称
        """
        try:
            self.client.delete_object(
                Bucket=self.bucket,
                Key=key
            )
            logger.info(f"文件删除成功: {key}")
        except Exception as e:
            logger.error(f"文件删除失败: {e}")
            raise e
